define("dojox/widget/TitleGroup", ["dojo", "dijit/registry", "dijit/_Widget", "dijit/TitlePane"], function (dojo, registry, widget, titlepane) {

    var tp = titlepane.prototype,
        lookup = function () {
            // generic handler function for click and keypress
            var parent = this._dxfindParent && this._dxfindParent();
            parent && parent.selectChild(this);
        }
        ;

    // this might hide this uberprivate function from the docparser.
    tp._dxfindParent = function () {
        // summary:
        //		TitlePane's MUST be first-children of a TitleGroup. only used by
        //		`dojox.widget.TitleGroup`. Finds a possible parent TitleGroup of a TitlePane
        var n = this.domNode.parentNode;
        if (n) {
            n = registry.getEnclosingWidget(n);
            return n && n instanceof dojox.widget.TitleGroup && n;
        }
        return n;
    };

    // if we click our own title, hide everyone
    dojo.connect(tp, "_onTitleClick", lookup);
    dojo.connect(tp, "_onTitleKey", function (e) {
        // if we're tabbing through the items in a group, don't do toggles.
        // if we hit enter, let it happen.
        if (!(e && e.type && e.type == "keypress" && e.charOrCode == dojo.keys.TAB)) {
            lookup.apply(this, arguments);
        }
    });

    return dojo.declare("dojox.widget.TitleGroup", dijit._Widget, {
        // summary:
        //		A container which controls a series of `dijit.TitlePane`s,
        //		allowing one to be visible and hiding siblings
        // description:
        //		A container which controls a series of `dijit.TitlePane`s,
        //		allowing one to be visible and hiding siblings. Behaves similarly
        //		to a `dijit.layout.AccordionContainer` in that the children
        //		are all stacked, though merges the TitlePane behavior of
        //		variable height
        // example:
        //	|	var group = new dojox.widget.TitleGroup().placeAt(dojo.body());
        //	|	new dijit.TitlePane({ title:"One" }, "fromsource").placeAt(group);
        //	|	new dijit.TitlePane({ title:"Remote", href:"foo.html" }).placeAt(group);

        "class":"dojoxTitleGroup",

        addChild:function (widget, position) {
            // summary:
            //		Add a passed widget reference to this container at an optional
            //		position index.
            // widget: dijit.TitlePane
            //		A widget reference to add
            // position: String|Int?
            //		An optional index or position to pass. defaults to "last"
            return widget.placeAt(this.domNode, position); // dijit.TitlePane
        },

        removeChild:function (widget) {
            // summary:
            //		Remove the passed widget from this container. Does not destroy
            //		child.

            this.domNode.removeChild(widget.domNode);
            return widget;
        },

        selectChild:function (widget) {
            // summary:
            //		close all found titlePanes within this group, excluding
            //		the one the we pass to select
            widget && dojo.query("> .dijitTitlePane", this.domNode).forEach(function (n) {
                var tp = registry.byNode(n);
                tp && tp !== widget && tp.open && tp.toggle(); // could race if open is set onEnd of slide
            });
            return widget; // dijit/TitlePane
        }

    });

});
